/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.deko;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.swt.dialog.SWT_Fehler;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.element.menue.SWT_MenueLeiste;
import de.mnit.basis.swt.element.steuer.A_SWT_Steuer;
import de.mnit.basis.sys.event.S_Zuhoerer;

/**
 * @author Michael Nitsche
 * 12.02.2010	Erstellt
 */
public abstract class A_SWT_Fenster<T extends A_SWT_Fenster<?>>  extends A_SWT_Steuer<T, Shell> implements S_Fenster<T> {

//	public abstract void eEndeFenster(S_Extern<?, Boolean> e);


//	TODO Paßt das noch ins System? Prüfen!
	public abstract SWT_MenueLeiste nMenue_Leiste();

//	public abstract void start(boolean sleak);
//	public abstract void start(boolean sleak, S_Zuhoerer<Object> bereit/*, POSITION position*/);

	public void start() {
		start(null);
	}

	public void start(S_Zuhoerer<Object> bereit) {
		Display display=/*sleak ? iSleakDisplay() :*/ new Display();
		try {
			this.erzeugeSWT(display, null);
			this.swt().layout();
			if(bereit!=null)
				bereit.verarbeite(null);
			iHauptschleife(this);
			this.swt().dispose();
		}
		catch(Throwable t) {
			Fehler.zeig(t);
		}
	}

	private static void iHauptschleife(S_SWT_Komponente<?,Shell> fenster) {
		Display display=fenster.swt().getDisplay();
		while(!fenster.swt().isDisposed()) {
			try {
				while(!fenster.swt().isDisposed())
					if(!display.readAndDispatch())
						display.sleep();
			}
			catch(Throwable t) {
				/*
				 * EXTREM WICHTIGE ZEILE!
				 * WAS SOLL BEI PROGRAMMFEHLERN PASSIEREN?
				 * Bis 03.03.2009 wurde die Anwendung bei Programmfehlern direkt beendet!
				 * Aber es sollte eigentlich so sein, daß die Anwendung weiterläuft und nur
				 * bei groben Fehlern, gezielt direkt im Code, beendet wird
				 */
				SWT_Fehler.zeig(t, false); //FIXME Hatte schon, dass zwar der Fehlerdialog kam, allerdings war er nicht anklickbar und die Anwendung war eingefroren! Problem, der SWT-Display-Thread läuft ja auch nicht mehr!
			}
		}
	}

}
